package com.mjf.scala.chapter09

/**
 * 异常处理
 *  -Java的异常
 *    >异常的体系结构
 *      -Throwable
 *          &Error
 *          &Exception
 *              #编译时异常
 *              #运行时异常
 *    >异常执行原理
 *      -程序运行的过程中，如果发生了异常，那么底层会创建对象的异常类型对象，通过throw关键字，
 *       将异常向上抛出；JVM会找能够对异常进行处理的代码（对异常进行捕获），将异常交给对应的处理代码进行处理。
 *
 *    >异常处理的方式
 *      -通过throws声明异常
 *      -通过try-catch进行捕获处理
 *
 *  -Scala异常
 *      >Scala中不区分编译时异常以及运行时异常
 *      >Scala在进行异常捕获的时候，只有一个catch块，在catch块中，通过模式匹配，匹配不同类型的异常。
 *        而且在进行匹配，就算是将大类型的异常放在前，也不会报错（但是不建议这样做）
 *      >通过在@Throws注解标记方法可能会发生异常
 *
 */
object Scala01_TestException {
  def main(args: Array[String]): Unit = {

    try{
      // 可能发生异常的代码
      10 / 0
      println("程序正常执行")
    } catch {
      // 异常处理的代码
      case e : ArithmeticException => println("发生算术异常了" + e.getMessage)
      case e : Exception => print("发生异常了" + e.getMessage)
    } finally {
      // 不管是否发生异常都会执行
      println("finally被执行了")
    }

    println("异常之外的代码")


/*
    @throws(classOf[NullPointerException])
    def ff(): Nothing = {
      throw NullPointerException    // 异常的返回值为Nothing
    }
*/

  }
}
